import { ArrayPoint } from '@/typings/GeometryType';

/**
 * 罗德里格旋转公式
 * @param t 旋转向量
 * @param k 旋转轴
 * @param r 旋转角度
 */
function rodrigo(t: ArrayPoint, k: ArrayPoint, r: number) {
  const [u, v, w] = t;
  const [x, y, z] = k;
  const sin = Math.sin(r);
  const cos = Math.cos(r);
  const m = (x * u + y * v + z * w) * (1 - cos);
  const result: ArrayPoint = [
    u * cos + (y * w - z * v) * sin + x * m,
    v * cos + (z * u - x * w) * sin + y * m,
    w * cos + (x * v - y * u) * sin + z * m,
  ];
  return result;
}

export default rodrigo;
